package com.cloudkinto.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import org.apache.commons.lang.ArrayUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * zpl格式转换工具类 <a href="https://labelary.com/service.html">基于Labelary公司提供的服务</a>
 *
 * @author long
 * @Date 2025/05/27
 */
public class ZplConverterUtils {

    public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\23996\\Downloads\\241561.zpl");
        FileInputStream inputStream = new FileInputStream(file);
        // 从流中读取ZPL内容
        byte[] buff = new byte[1024];
        byte[] data = new byte[0];
        while (inputStream.read(buff) != -1) {
            data = ArrayUtils.addAll(data, buff);
        }
        String zpl = new String(data, StandardCharsets.UTF_8);
        zpl = setCJHFont(zpl);
        String apiUrl = "http://api.labelary.com/v1/printers/8dpmm/labels/5.9x8.9/";
        // 设置请求头
        Map<String, String> headers = new HashMap<>();
        headers.put("Accept", "application/pdf");
        headers.put("Content-Type", "application/x-www-form-urlencoded");
        try (HttpResponse response = HttpUtil.createPost(apiUrl)
                .addHeaders(headers)
                .body(zpl)
                .execute()) {
            if (response.isOk()) {
                byte[] pdfBytes = response.bodyBytes();
                FileUtil.writeBytes(pdfBytes, "C:\\Users\\23996\\Downloads\\output1.pdf");
            }
        }
    }

    /**
     * zpl格式转换为pdf
     *
     * @param zpl    zpl内容
     * @param width  标签宽度（以英寸为单位）。可以使用任何数值。
     * @param height 标签高度（以英寸为单位）。可以使用任何数值。
     * @return pdf文件字节, 失败返回null
     */
    public static byte[] convertZplToPdf(String zpl, String width, String height) {
        zpl = setCJHFont(zpl);
        String apiUrl = String.format("http://api.labelary.com/v1/printers/8dpmm/labels/%sx%s/", width, height);
        // 设置请求头
        Map<String, String> headers = new HashMap<>();
        headers.put("Accept", "application/pdf");
        headers.put("Content-Type", "application/x-www-form-urlencoded");
        try (HttpResponse response = HttpUtil.createPost(apiUrl)
                .addHeaders(headers)
                .body(zpl)
                .execute()) {
            if (response.isOk()) {
                return response.bodyBytes();
            }
        }
        return null;
    }

    /**
     * zpl格式转换为pdf
     *
     * @param zplBytes zpl内容
     * @param width    标签宽度（以英寸为单位）
     * @param height   标签高度（以英寸为单位）
     * @return pdf文件字节
     */
    public static byte[] convertZplToPdf(byte[] zplBytes, String width, String height) {
        String zpl = new String(zplBytes, StandardCharsets.UTF_8);
        return convertZplToPdf(zpl, width, height);
    }

    /**
     * zpl格式转换为pdf
     *
     * @param zplBytes     zpl内容
     * @param outputStream 输出流
     * @param width        标签宽度（以英寸为单位）
     * @param height       标签高度（以英寸为单位）
     */
    public static void convertZplToPdf(byte[] zplBytes, OutputStream outputStream, String width, String height) throws IOException {
        String zpl = new String(zplBytes, StandardCharsets.UTF_8);
        byte[] pdfBytes = convertZplToPdf(zpl, width, height);
        if (pdfBytes == null) {
            outputStream.write("convert fail".getBytes(StandardCharsets.UTF_8));
        }
        if (pdfBytes != null) {
            outputStream.write(pdfBytes);
        }
    }

    /**
     * 适配中日韩字体
     */
    private static String setCJHFont(String zpl) {
        //定位第二个^XA
        int startIndex = zpl.indexOf("^XA") + 3;
        //添加字符串到定位点处，添加字体设置
        zpl = zpl.substring(0, startIndex) + "^CFJ,50" + zpl.substring(startIndex);
        return zpl;
    }
}